Run download_data.Rmd and percentage_of_regional_richness.Rmd First!

library(randomForest)
library(reshape2)
library(rpart)
library(ggplot2)
library(tidyverse)

library(multcomp)
library(car)
library(VSURF)

library(boot)
length(city_data$city_gdp_per_population[!is.na(city_data$city_gdp_per_population)])
[1] 30
length(city_data$percentage_urban_area_as_open_public_spaces[!is.na(city_data$percentage_urban_area_as_open_public_spaces)])
[1] 61
length(city_data$happiness_future_life[!is.na(city_data$happiness_future_life)])
[1] 65
length(city_data$mean_population_exposure_to_pm2_5_2019[!is.na(city_data$mean_population_exposure_to_pm2_5_2019)])
[1] 131
fetch_city_data_for <- function(pool_name, include_city_name = F) {
  results_filename <- paste(paste('percentage_of_regional_richness__output_', pool_name, 'city', 'richness', 'intercept', sep = "_"), "csv", sep = ".")
  results <- read_csv(results_filename)
  
  joined <- left_join(city_data, results)
  
  required_columns <- c("population_growth", "rainfall_monthly_min", "rainfall_annual_average", "rainfall_monthly_max", "temperature_annual_average", "temperature_monthly_min", "temperature_monthly_max", "happiness_negative_effect", "happiness_positive_effect", "happiness_future_life", "number_of_biomes", "realm", "biome_name", "region_20km_includes_estuary", "region_50km_includes_estuary", "region_100km_includes_estuary", "city_includes_estuary", "region_20km_average_pop_density", "region_50km_average_pop_density", "region_100km_average_pop_density", "city_max_pop_density", "city_average_pop_density", "mean_population_exposure_to_pm2_5_2019", "region_20km_cultivated", "region_20km_urban", "region_50km_cultivated", "region_50km_urban", "region_100km_cultivated", "region_100km_urban", "region_20km_elevation_delta", "region_20km_mean_elevation", "region_50km_elevation_delta", "region_50km_mean_elevation", "region_100km_elevation_delta", "region_100km_mean_elevation", "city_elevation_delta", "city_mean_elevation", "urban", "shrubs", "permanent_water", "open_forest", "herbaceous_wetland", "herbaceous_vegetation", "cultivated", "closed_forest", "share_of_population_within_400m_of_open_space", "percentage_urban_area_as_streets", "percentage_urban_area_as_open_public_spaces_and_streets", "percentage_urban_area_as_open_public_spaces", "city_gdp_per_population", "city_ndvi", "city_ssm", "city_susm", "region_20km_ndvi", "region_20km_ssm", "region_20km_susm", "region_50km_ndvi", "region_50km_ssm", "region_50km_susm", "region_100km_ndvi", "region_100km_ssm", "region_100km_susm", "city_percentage_protected", "region_20km_percentage_protected", "region_50km_percentage_protected", "region_100km_percentage_protected")
  
  if (include_city_name) {
    required_columns <- append(c("name"), required_columns)
  }
  
  required_columns <- append(c("response"), required_columns)
  
  joined[,required_columns]
}
Merlin Response
merlin_city_data <- fetch_city_data_for('merlin')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
merlin_city_data
merlin_city_data_fixed <- rfImpute(response ~ ., merlin_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.17   117.46 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |     20.9   115.96 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    20.95   116.22 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.01   116.56 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    21.82   121.06 |
merlin_city_data_fixed

names(merlin_city_data_fixed)
merlin_interp <- VSURF(x = merlin_predictors, y  = merlin_response)
names(merlin_predictors[,merlin_interp$varselect.interp])
[1] "region_50km_elevation_delta" "biome_name"                  "region_50km_ssm"             "region_100km_ssm"           
Birdlife Response
birdlife_city_data <- fetch_city_data_for('birdlife')

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
birdlife_city_data

birdlife_city_data_fixed <- rfImpute(response ~ ., birdlife_city_data)
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.752    91.05 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.722    90.57 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.783    91.54 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |      5.8    91.81 |
     |      Out-of-bag   |
Tree |      MSE  %Var(y) |
 300 |    5.839    92.43 |
birdlife_city_data_fixed
names(merlin_city_data_fixed)
 [1] "response"                                                "population_growth"                                      
 [3] "rainfall_monthly_min"                                    "rainfall_annual_average"                                
 [5] "rainfall_monthly_max"                                    "temperature_annual_average"                             
 [7] "temperature_monthly_min"                                 "temperature_monthly_max"                                
 [9] "happiness_negative_effect"                               "happiness_positive_effect"                              
[11] "happiness_future_life"                                   "number_of_biomes"                                       
[13] "realm"                                                   "biome_name"                                             
[15] "region_20km_includes_estuary"                            "region_50km_includes_estuary"                           
[17] "region_100km_includes_estuary"                           "city_includes_estuary"                                  
[19] "region_20km_average_pop_density"                         "region_50km_average_pop_density"                        
[21] "region_100km_average_pop_density"                        "city_max_pop_density"                                   
[23] "city_average_pop_density"                                "mean_population_exposure_to_pm2_5_2019"                 
[25] "region_20km_cultivated"                                  "region_20km_urban"                                      
[27] "region_50km_cultivated"                                  "region_50km_urban"                                      
[29] "region_100km_cultivated"                                 "region_100km_urban"                                     
[31] "region_20km_elevation_delta"                             "region_20km_mean_elevation"                             
[33] "region_50km_elevation_delta"                             "region_50km_mean_elevation"                             
[35] "region_100km_elevation_delta"                            "region_100km_mean_elevation"                            
[37] "city_elevation_delta"                                    "city_mean_elevation"                                    
[39] "urban"                                                   "shrubs"                                                 
[41] "permanent_water"                                         "open_forest"                                            
[43] "herbaceous_wetland"                                      "herbaceous_vegetation"                                  
[45] "cultivated"                                              "closed_forest"                                          
[47] "share_of_population_within_400m_of_open_space"           "percentage_urban_area_as_streets"                       
[49] "percentage_urban_area_as_open_public_spaces_and_streets" "percentage_urban_area_as_open_public_spaces"            
[51] "city_gdp_per_population"                                 "city_ndvi"                                              
[53] "city_ssm"                                                "city_susm"                                              
[55] "region_20km_ndvi"                                        "region_20km_ssm"                                        
[57] "region_20km_susm"                                        "region_50km_ndvi"                                       
[59] "region_50km_ssm"                                         "region_50km_susm"                                       
[61] "region_100km_ndvi"                                       "region_100km_ssm"                                       
[63] "region_100km_susm"                                       "city_percentage_protected"                              
[65] "region_20km_percentage_protected"                        "region_50km_percentage_protected"                       
[67] "region_100km_percentage_protected"                      
birdlife_interp <- VSURF(x = birdlife_predictors, y  = birdlife_response)
Thresholding step
Estimated computational time (on one core): 102.4 sec.

  |                                                                                                                                                     
  |                                                                                                                                               |   0%
  |                                                                                                                                                     
  |===                                                                                                                                            |   2%
  |                                                                                                                                                     
  |======                                                                                                                                         |   4%
  |                                                                                                                                                     
  |=========                                                                                                                                      |   6%
  |                                                                                                                                                     
  |===========                                                                                                                                    |   8%
  |                                                                                                                                                     
  |==============                                                                                                                                 |  10%
  |                                                                                                                                                     
  |=================                                                                                                                              |  12%
  |                                                                                                                                                     
  |====================                                                                                                                           |  14%
  |                                                                                                                                                     
  |=======================                                                                                                                        |  16%
  |                                                                                                                                                     
  |==========================                                                                                                                     |  18%
  |                                                                                                                                                     
  |=============================                                                                                                                  |  20%
  |                                                                                                                                                     
  |===============================                                                                                                                |  22%
  |                                                                                                                                                     
  |==================================                                                                                                             |  24%
  |                                                                                                                                                     
  |=====================================                                                                                                          |  26%
  |                                                                                                                                                     
  |========================================                                                                                                       |  28%
  |                                                                                                                                                     
  |===========================================                                                                                                    |  30%
  |                                                                                                                                                     
  |==============================================                                                                                                 |  32%
  |                                                                                                                                                     
  |=================================================                                                                                              |  34%
  |                                                                                                                                                     
  |===================================================                                                                                            |  36%
  |                                                                                                                                                     
  |======================================================                                                                                         |  38%
  |                                                                                                                                                     
  |=========================================================                                                                                      |  40%
  |                                                                                                                                                     
  |============================================================                                                                                   |  42%
  |                                                                                                                                                     
  |===============================================================                                                                                |  44%
  |                                                                                                                                                     
  |==================================================================                                                                             |  46%
  |                                                                                                                                                     
  |=====================================================================                                                                          |  48%
  |                                                                                                                                                     
  |========================================================================                                                                       |  50%
  |                                                                                                                                                     
  |==========================================================================                                                                     |  52%
  |                                                                                                                                                     
  |=============================================================================                                                                  |  54%
  |                                                                                                                                                     
  |================================================================================                                                               |  56%
  |                                                                                                                                                     
  |===================================================================================                                                            |  58%
  |                                                                                                                                                     
  |======================================================================================                                                         |  60%
  |                                                                                                                                                     
  |=========================================================================================                                                      |  62%
  |                                                                                                                                                     
  |============================================================================================                                                   |  64%
  |                                                                                                                                                     
  |==============================================================================================                                                 |  66%
  |                                                                                                                                                     
  |=================================================================================================                                              |  68%
  |                                                                                                                                                     
  |====================================================================================================                                           |  70%
  |                                                                                                                                                     
  |=======================================================================================================                                        |  72%
  |                                                                                                                                                     
  |==========================================================================================================                                     |  74%
  |                                                                                                                                                     
  |=============================================================================================================                                  |  76%
  |                                                                                                                                                     
  |================================================================================================================                               |  78%
  |                                                                                                                                                     
  |==================================================================================================================                             |  80%
  |                                                                                                                                                     
  |=====================================================================================================================                          |  82%
  |                                                                                                                                                     
  |========================================================================================================================                       |  84%
  |                                                                                                                                                     
  |===========================================================================================================================                    |  86%
  |                                                                                                                                                     
  |==============================================================================================================================                 |  88%
  |                                                                                                                                                     
  |=================================================================================================================================              |  90%
  |                                                                                                                                                     
  |====================================================================================================================================           |  92%
  |                                                                                                                                                     
  |======================================================================================================================================         |  94%
  |                                                                                                                                                     
  |=========================================================================================================================================      |  96%
  |                                                                                                                                                     
  |============================================================================================================================================   |  98%
  |                                                                                                                                                     
  |===============================================================================================================================================| 100%
Interpretation step (on 45 variables)
Estimated computational time (on one core): between 60.7 sec. and  366.8 sec.

  |                                                                                                                                                     
  |                                                                                                                                               |   0%
  |                                                                                                                                                     
  |===                                                                                                                                            |   2%
  |                                                                                                                                                     
  |======                                                                                                                                         |   4%
  |                                                                                                                                                     
  |==========                                                                                                                                     |   7%
  |                                                                                                                                                     
  |=============                                                                                                                                  |   9%
  |                                                                                                                                                     
  |================                                                                                                                               |  11%
  |                                                                                                                                                     
  |===================                                                                                                                            |  13%
  |                                                                                                                                                     
  |======================                                                                                                                         |  16%
  |                                                                                                                                                     
  |=========================                                                                                                                      |  18%
  |                                                                                                                                                     
  |=============================                                                                                                                  |  20%
  |                                                                                                                                                     
  |================================                                                                                                               |  22%
  |                                                                                                                                                     
  |===================================                                                                                                            |  24%
  |                                                                                                                                                     
  |======================================                                                                                                         |  27%
  |                                                                                                                                                     
  |=========================================                                                                                                      |  29%
  |                                                                                                                                                     
  |============================================                                                                                                   |  31%
  |                                                                                                                                                     
  |================================================                                                                                               |  33%
  |                                                                                                                                                     
  |===================================================                                                                                            |  36%
  |                                                                                                                                                     
  |======================================================                                                                                         |  38%
  |                                                                                                                                                     
  |=========================================================                                                                                      |  40%
  |                                                                                                                                                     
  |============================================================                                                                                   |  42%
  |                                                                                                                                                     
  |================================================================                                                                               |  44%
  |                                                                                                                                                     
  |===================================================================                                                                            |  47%
  |                                                                                                                                                     
  |======================================================================                                                                         |  49%
  |                                                                                                                                                     
  |=========================================================================                                                                      |  51%
  |                                                                                                                                                     
  |============================================================================                                                                   |  53%
  |                                                                                                                                                     
  |===============================================================================                                                                |  56%
  |                                                                                                                                                     
  |===================================================================================                                                            |  58%
  |                                                                                                                                                     
  |======================================================================================                                                         |  60%
  |                                                                                                                                                     
  |=========================================================================================                                                      |  62%
  |                                                                                                                                                     
  |============================================================================================                                                   |  64%
  |                                                                                                                                                     
  |===============================================================================================                                                |  67%
  |                                                                                                                                                     
  |===================================================================================================                                            |  69%
  |                                                                                                                                                     
  |======================================================================================================                                         |  71%
  |                                                                                                                                                     
  |=========================================================================================================                                      |  73%
  |                                                                                                                                                     
  |============================================================================================================                                   |  76%
  |                                                                                                                                                     
  |===============================================================================================================                                |  78%
  |                                                                                                                                                     
  |==================================================================================================================                             |  80%
  |                                                                                                                                                     
  |======================================================================================================================                         |  82%
  |                                                                                                                                                     
  |=========================================================================================================================                      |  84%
  |                                                                                                                                                     
  |============================================================================================================================                   |  87%
  |                                                                                                                                                     
  |===============================================================================================================================                |  89%
  |                                                                                                                                                     
  |==================================================================================================================================             |  91%
  |                                                                                                                                                     
  |=====================================================================================================================================          |  93%
  |                                                                                                                                                     
  |=========================================================================================================================================      |  96%
  |                                                                                                                                                     
  |============================================================================================================================================   |  98%
  |                                                                                                                                                     
  |===============================================================================================================================================| 100%
Prediction step (on 2 variables)
Maximum estimated computational time (on one core): 2.6 sec.

  |                                                                                                                                                     
  |                                                                                                                                               |   0%
  |                                                                                                                                                     
  |========================================================================                                                                       |  50%
  |                                                                                                                                                     
  |===============================================================================================================================================| 100%
names(birdlife_predictors[,birdlife_interp$varselect.interp])
[1] "population_growth" "region_50km_ssm"  
So….
Merlin: “region_50km_elevation_delta” “biome_name” “region_50km_ssm” “region_100km_ssm” Birdlife: “population_growth” “region_50km_ssm”

Try Modelling

birdlife_city_data_named <- fetch_city_data_for('birdlife', T)

── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  name = col_character(),
  response = col_double()
)

Joining, by = "name"
Use cross validation and dropping terms to find best model

full model: response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth

Merlin data set

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.72841

– CVE 19.72841 – Can we drop one?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.39392
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.3626
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + biome_name + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.79173
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.53183
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 19.38052

– drop biome_name to give smaller CVE of 18.53183 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.26184
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.24017
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + population_growth, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.79038
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.20095

– drop population_growth to give CVE of 18.20095 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 17.9362
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 17.91216
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.48549

– drop region_50km_ssm to give CVE of 17.91216 – can we drop another?

cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.19515
cv.glm(merlin_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta, data = merlin_city_data_fixed_no_boreal))$delta[1]
[1] 18.04985
– best model with region_100km_ssm + region_50km_elevation_delta (CV error 17.91216)
summary(glm(data = merlin_city_data_fixed, formula = response ~ region_100km_ssm + region_50km_elevation_delta))

Call:
glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta, 
    data = merlin_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-7.6599  -2.9987  -0.5524   1.7449  16.9143  

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)  
(Intercept)                  2.6809304  1.1210300   2.391   0.0182 *
region_100km_ssm            -0.1331207  0.0695604  -1.914   0.0578 .
region_50km_elevation_delta -0.0006899  0.0003461  -1.994   0.0482 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 17.36262)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 2326.6  on 134  degrees of freedom
AIC: 784.8

Number of Fisher Scoring iterations: 2
reg_merlin = glm(data = merlin_city_data_fixed, formula = response ~ region_100km_ssm + region_50km_elevation_delta)
with(summary(reg_merlin), 1 - deviance/null.deviance)
[1] 0.05791102

Birdlife data set

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.899862

– can we drop a variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.768164
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.752211
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + biome_name + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.989636
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.503421
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta + biome_name, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.780578

– drop biome_name to give CVE of 6.503421 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.417311
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.426562
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.430742
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_100km_ssm + region_50km_ssm + region_50km_elevation_delta, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.439714

– drop region_100km_ssm to give CVE of 6.417311 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_elevation_delta + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.535285
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.342025
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm + region_50km_elevation_delta, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.352664

– drop region_50km_elevation_delta to give CVE of 6.342025 – can we drop another?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ population_growth, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.464699
cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.291299

– drop city_gdp_per_population to give CVE of 6.291299 – is this better than no variable?

cv.glm(birdlife_city_data_fixed_no_boreal, glm(formula = response ~ 1, data = birdlife_city_data_fixed_no_boreal))$delta[1]
[1] 6.395701

– yes, just!

– so best model with birdlife is region_50km_ssm
summary(glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm))

Call:
glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_fixed)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-4.5353  -1.5461  -0.4124   1.3071  10.7572  

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)      1.26916    0.65041   1.951   0.0531 .
region_50km_ssm -0.08499    0.04115  -2.065   0.0408 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 6.214378)

    Null deviance: 865.45  on 136  degrees of freedom
Residual deviance: 838.94  on 135  degrees of freedom
AIC: 643.06

Number of Fisher Scoring iterations: 2
reg_birdlife = glm(data = birdlife_city_data_fixed, formula = response ~ region_50km_ssm)
with(summary(reg_birdlife), 1 - deviance/null.deviance)
[1] 0.03062471
ggplot(birdlife_city_data_named, aes(x = region_50km_ssm, y = response)) + geom_point() + geom_smooth(method = "glm")
`geom_smooth()` using formula 'y ~ x'

Check birdlife model fit

birdlife_city_data_fixed_no_boreal[c(16, 53, 72), c("region_50km_ssm")]
[1] 18.451180  9.961682 11.644862
dat <- predict(glm(formula = response ~ region_50km_ssm, data = birdlife_city_data_named), se.fit=T)

outside_se <- birdlife_city_data_named[birdlife_city_data_named$response < dat$fit - 15* dat$se.fit | birdlife_city_data_named$response > dat$fit + 15 * dat$se.fit,]

ggplot(birdlife_city_data_named, aes(x = region_50km_ssm, y = response)) + 
  geom_point(size=1) + 
  geom_smooth(method = "glm") +
  geom_text(aes(label = name), data = outside_se, size = 3, position = "dodge", vjust = "inward", hjust = "inward", color = "red", angle=-15) +
  geom_point(data = outside_se, color = "red") +
  theme_bw() +
  ylab("City Random Effect Intercept") + xlab("Regional (50km) SSM") + labs(title = "Birdlife")
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`
ggsave("city_effect_richness__output__birdlife.jpg")
Saving 7.29 x 4.51 in image
`geom_smooth()` using formula 'y ~ x'
Warning: Width not defined. Set with `position_dodge(width = ?)`

How much variation have we explained?

ggplot(birdlife_city_data_named, aes(y = response, x = residuals)) + 
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  labs(title = "Birdlife", subtitle = paste("Correlation", cor(birdlife_city_data_named$residuals, birdlife_city_data_named$response))) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'

Check Merlin model fit
merlin.fit <- glm(data = merlin_city_data_named, formula = response ~ region_100km_ssm + region_50km_elevation_delta)
summary(merlin.fit)

Call:
glm(formula = response ~ region_100km_ssm + region_50km_elevation_delta, 
    data = merlin_city_data_named)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-7.6599  -2.9987  -0.5524   1.7449  16.9143  

Coefficients:
                              Estimate Std. Error t value Pr(>|t|)  
(Intercept)                  2.6809304  1.1210300   2.391   0.0182 *
region_100km_ssm            -0.1331207  0.0695604  -1.914   0.0578 .
region_50km_elevation_delta -0.0006899  0.0003461  -1.994   0.0482 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 17.36262)

    Null deviance: 2469.6  on 136  degrees of freedom
Residual deviance: 2326.6  on 134  degrees of freedom
AIC: 784.8

Number of Fisher Scoring iterations: 2
with(summary(merlin.fit), 1 - deviance/null.deviance)
[1] 0.05791102
plot(merlin.fit)

ggplot(merlin_city_data_named, aes(x = region_100km_ssm, y = response)) + 
  geom_point(aes(size = region_50km_elevation_delta)) + 
  geom_smooth(method = "glm") +
  theme_bw() +
  theme(legend.position="bottom") +
  ylab("City Random Effect Intercept") + xlab("Regional (100km) SSM") + labs(title = "eBird") + guides(size=guide_legend(title="Regional (50km) Elevation Delta"))
`geom_smooth()` using formula 'y ~ x'

How much variation have we explained?

ggplot(merlin_city_data_named, aes(y = response, x = residuals)) + 
  geom_point() +
  geom_smooth(method = "lm", se = F) +
  labs(title = "Merlin", subtitle = paste("Correlation", cor(merlin_city_data_named$residuals, merlin_city_data_named$response))) +
  theme_bw()
`geom_smooth()` using formula 'y ~ x'

Check AIC
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpSdW4gYGRvd25sb2FkX2RhdGEuUm1kYCBhbmQgYHBlcmNlbnRhZ2Vfb2ZfcmVnaW9uYWxfcmljaG5lc3MuUm1kYCBGaXJzdCEKCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShycGFydCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmxpYnJhcnkobXVsdGNvbXApCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KFZTVVJGKQoKbGlicmFyeShib290KQpgYGAKCmBgYHtyfQpjaXR5X2RhdGEKYGBgCgpgYGB7cn0KbGVuZ3RoKGNpdHlfZGF0YSRjaXR5X2dkcF9wZXJfcG9wdWxhdGlvblshaXMubmEoY2l0eV9kYXRhJGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uKV0pCmxlbmd0aChjaXR5X2RhdGEkcGVyY2VudGFnZV91cmJhbl9hcmVhX2FzX29wZW5fcHVibGljX3NwYWNlc1shaXMubmEoY2l0eV9kYXRhJHBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMpXSkKbGVuZ3RoKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmVbIWlzLm5hKGNpdHlfZGF0YSRoYXBwaW5lc3NfZnV0dXJlX2xpZmUpXSkKbGVuZ3RoKGNpdHlfZGF0YSRtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOVshaXMubmEoY2l0eV9kYXRhJG1lYW5fcG9wdWxhdGlvbl9leHBvc3VyZV90b19wbTJfNV8yMDE5KV0pCmBgYAoKYGBge3J9CmZldGNoX2NpdHlfZGF0YV9mb3IgPC0gZnVuY3Rpb24ocG9vbF9uYW1lLCBpbmNsdWRlX2NpdHlfbmFtZSA9IEYpIHsKICByZXN1bHRzX2ZpbGVuYW1lIDwtIHBhc3RlKHBhc3RlKCdwZXJjZW50YWdlX29mX3JlZ2lvbmFsX3JpY2huZXNzX19vdXRwdXRfJywgcG9vbF9uYW1lLCAnY2l0eScsICdyaWNobmVzcycsICdpbnRlcmNlcHQnLCBzZXAgPSAiXyIpLCAiY3N2Iiwgc2VwID0gIi4iKQogIHJlc3VsdHMgPC0gcmVhZF9jc3YocmVzdWx0c19maWxlbmFtZSkKICAKICBqb2luZWQgPC0gbGVmdF9qb2luKGNpdHlfZGF0YSwgcmVzdWx0cykKICAKICByZXF1aXJlZF9jb2x1bW5zIDwtIGMoInBvcHVsYXRpb25fZ3Jvd3RoIiwgInJhaW5mYWxsX21vbnRobHlfbWluIiwgInJhaW5mYWxsX2FubnVhbF9hdmVyYWdlIiwgInJhaW5mYWxsX21vbnRobHlfbWF4IiwgInRlbXBlcmF0dXJlX2FubnVhbF9hdmVyYWdlIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWluIiwgInRlbXBlcmF0dXJlX21vbnRobHlfbWF4IiwgImhhcHBpbmVzc19uZWdhdGl2ZV9lZmZlY3QiLCAiaGFwcGluZXNzX3Bvc2l0aXZlX2VmZmVjdCIsICJoYXBwaW5lc3NfZnV0dXJlX2xpZmUiLCAibnVtYmVyX29mX2Jpb21lcyIsICJyZWFsbSIsICJiaW9tZV9uYW1lIiwgInJlZ2lvbl8yMGttX2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzUwa21faW5jbHVkZXNfZXN0dWFyeSIsICJyZWdpb25fMTAwa21faW5jbHVkZXNfZXN0dWFyeSIsICJjaXR5X2luY2x1ZGVzX2VzdHVhcnkiLCAicmVnaW9uXzIwa21fYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJyZWdpb25fNTBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgInJlZ2lvbl8xMDBrbV9hdmVyYWdlX3BvcF9kZW5zaXR5IiwgImNpdHlfbWF4X3BvcF9kZW5zaXR5IiwgImNpdHlfYXZlcmFnZV9wb3BfZGVuc2l0eSIsICJtZWFuX3BvcHVsYXRpb25fZXhwb3N1cmVfdG9fcG0yXzVfMjAxOSIsICJyZWdpb25fMjBrbV9jdWx0aXZhdGVkIiwgInJlZ2lvbl8yMGttX3VyYmFuIiwgInJlZ2lvbl81MGttX2N1bHRpdmF0ZWQiLCAicmVnaW9uXzUwa21fdXJiYW4iLCAicmVnaW9uXzEwMGttX2N1bHRpdmF0ZWQiLCAicmVnaW9uXzEwMGttX3VyYmFuIiwgInJlZ2lvbl8yMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyZWdpb25fMjBrbV9tZWFuX2VsZXZhdGlvbiIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiLCAicmVnaW9uXzUwa21fbWVhbl9lbGV2YXRpb24iLCAicmVnaW9uXzEwMGttX2VsZXZhdGlvbl9kZWx0YSIsICJyZWdpb25fMTAwa21fbWVhbl9lbGV2YXRpb24iLCAiY2l0eV9lbGV2YXRpb25fZGVsdGEiLCAiY2l0eV9tZWFuX2VsZXZhdGlvbiIsICJ1cmJhbiIsICJzaHJ1YnMiLCAicGVybWFuZW50X3dhdGVyIiwgIm9wZW5fZm9yZXN0IiwgImhlcmJhY2VvdXNfd2V0bGFuZCIsICJoZXJiYWNlb3VzX3ZlZ2V0YXRpb24iLCAiY3VsdGl2YXRlZCIsICJjbG9zZWRfZm9yZXN0IiwgInNoYXJlX29mX3BvcHVsYXRpb25fd2l0aGluXzQwMG1fb2Zfb3Blbl9zcGFjZSIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfc3RyZWV0cyIsICJwZXJjZW50YWdlX3VyYmFuX2FyZWFfYXNfb3Blbl9wdWJsaWNfc3BhY2VzX2FuZF9zdHJlZXRzIiwgInBlcmNlbnRhZ2VfdXJiYW5fYXJlYV9hc19vcGVuX3B1YmxpY19zcGFjZXMiLCAiY2l0eV9nZHBfcGVyX3BvcHVsYXRpb24iLCAiY2l0eV9uZHZpIiwgImNpdHlfc3NtIiwgImNpdHlfc3VzbSIsICJyZWdpb25fMjBrbV9uZHZpIiwgInJlZ2lvbl8yMGttX3NzbSIsICJyZWdpb25fMjBrbV9zdXNtIiwgInJlZ2lvbl81MGttX25kdmkiLCAicmVnaW9uXzUwa21fc3NtIiwgInJlZ2lvbl81MGttX3N1c20iLCAicmVnaW9uXzEwMGttX25kdmkiLCAicmVnaW9uXzEwMGttX3NzbSIsICJyZWdpb25fMTAwa21fc3VzbSIsICJjaXR5X3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8yMGttX3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl81MGttX3BlcmNlbnRhZ2VfcHJvdGVjdGVkIiwgInJlZ2lvbl8xMDBrbV9wZXJjZW50YWdlX3Byb3RlY3RlZCIpCiAgCiAgaWYgKGluY2x1ZGVfY2l0eV9uYW1lKSB7CiAgICByZXF1aXJlZF9jb2x1bW5zIDwtIGFwcGVuZChjKCJuYW1lIiksIHJlcXVpcmVkX2NvbHVtbnMpCiAgfQogIAogIHJlcXVpcmVkX2NvbHVtbnMgPC0gYXBwZW5kKGMoInJlc3BvbnNlIiksIHJlcXVpcmVkX2NvbHVtbnMpCiAgCiAgam9pbmVkWyxyZXF1aXJlZF9jb2x1bW5zXQp9CmBgYAoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KTWVybGluIFJlc3BvbnNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ21lcmxpbicpCm1lcmxpbl9jaXR5X2RhdGEKYGBgCgpgYGB7cn0KbWVybGluX2NpdHlfZGF0YV9maXhlZCA8LSByZkltcHV0ZShyZXNwb25zZSB+IC4sIG1lcmxpbl9jaXR5X2RhdGEpCm1lcmxpbl9jaXR5X2RhdGFfZml4ZWQKYGBgCgpgYGB7cn0KZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGFlcyhyZXNwb25zZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKQpgYGAKCmBgYHtyfQpuYW1lcyhtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkKQpgYGAKCmBgYHtyfQptZXJsaW5fcmVzcG9uc2UgPC0gbWVybGluX2NpdHlfZGF0YV9maXhlZCRyZXNwb25zZQptZXJsaW5fcHJlZGljdG9ycyA8LSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkWywtMV0KbWVybGluX3ByZWRpY3RvcnMKYGBgCgpgYGB7cn0KbWVybGluX2ludGVycCA8LSBWU1VSRih4ID0gbWVybGluX3ByZWRpY3RvcnMsIHkgID0gbWVybGluX3Jlc3BvbnNlKQpgYGAKCmBgYHtyfQpuYW1lcyhtZXJsaW5fcHJlZGljdG9yc1ssbWVybGluX2ludGVycCR2YXJzZWxlY3QuaW50ZXJwXSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkJpcmRsaWZlIFJlc3BvbnNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YSA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdiaXJkbGlmZScpCmJpcmRsaWZlX2NpdHlfZGF0YQpgYGAKCmBgYHtyfQpnZ3Bsb3QoYmlyZGxpZmVfY2l0eV9kYXRhLCBhZXMocmVzcG9uc2UpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkKYGBgCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkIDwtIHJmSW1wdXRlKHJlc3BvbnNlIH4gLiwgYmlyZGxpZmVfY2l0eV9kYXRhKQpiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQKYGBgCgpgYGB7cn0KbmFtZXMobWVybGluX2NpdHlfZGF0YV9maXhlZCkKYGBgCgpgYGB7cn0KYmlyZGxpZmVfcmVzcG9uc2UgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkJHJlc3BvbnNlCmJpcmRsaWZlX3ByZWRpY3RvcnMgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkWywtMV0KYmlyZGxpZmVfcHJlZGljdG9ycwpgYGAKCgoKYGBge3J9CmJpcmRsaWZlX2ludGVycCA8LSBWU1VSRih4ID0gYmlyZGxpZmVfcHJlZGljdG9ycywgeSAgPSBiaXJkbGlmZV9yZXNwb25zZSkKYGBgCgpgYGB7cn0KbmFtZXMoYmlyZGxpZmVfcHJlZGljdG9yc1ssYmlyZGxpZmVfaW50ZXJwJHZhcnNlbGVjdC5pbnRlcnBdKQpgYGAKCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU28uLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNZXJsaW46ICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiICJiaW9tZV9uYW1lIiAicmVnaW9uXzUwa21fc3NtIiAicmVnaW9uXzEwMGttX3NzbSIKQmlyZGxpZmU6ICJwb3B1bGF0aW9uX2dyb3d0aCIgInJlZ2lvbl81MGttX3NzbSIgIAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHJ5IE1vZGVsbGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCmBgYHtyfQptZXJsaW5fY2l0eV9kYXRhX25hbWVkIDwtIGZldGNoX2NpdHlfZGF0YV9mb3IoJ21lcmxpbicsIFQpCmJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCA8LSBmZXRjaF9jaXR5X2RhdGFfZm9yKCdiaXJkbGlmZScsIFQpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClVzZSBjcm9zcyB2YWxpZGF0aW9uIGFuZCBkcm9wcGluZyB0ZXJtcyB0byBmaW5kIGJlc3QgbW9kZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmdWxsIG1vZGVsOiAgcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoCgoKTWVybGluIGRhdGEgc2V0Ci0tLS0tLS0tLS0tLS0tLS0KYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsIDwtIG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRbbWVybGluX2NpdHlfZGF0YV9maXhlZCRiaW9tZV9uYW1lICE9ICdCb3JlYWwgRm9yZXN0cy9UYWlnYScsXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIENWRSAxOS43Mjg0MQotLSBDYW4gd2UgZHJvcCBvbmU/CgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgYmlvbWVfbmFtZSB0byBnaXZlIHNtYWxsZXIgQ1ZFIG9mIDE4LjUzMTgzCi0tIGNhbiB3ZSBkcm9wIGFub3RoZXI/CgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKG1lcmxpbl9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX3NzbSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgcG9wdWxhdGlvbl9ncm93dGggdG8gZ2l2ZSBDVkUgb2YgMTguMjAwOTUKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20sIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKLS0gZHJvcCByZWdpb25fNTBrbV9zc20gdG8gZ2l2ZSBDVkUgb2YgMTcuOTEyMTYKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtLCBkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0obWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gYmVzdCBtb2RlbCB3aXRoIHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKENWIGVycm9yIDE3LjkxMjE2KQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0Kc3VtbWFyeShnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEpKQpgYGAKCmBgYHtyfQpyZWdfbWVybGluID0gZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhKQp3aXRoKHN1bW1hcnkocmVnX21lcmxpbiksIDEgLSBkZXZpYW5jZS9udWxsLmRldmlhbmNlKQpgYGAKCkJpcmRsaWZlIGRhdGEgc2V0Ci0tLS0tLS0tLS0tLS0tLS0KYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwgPC0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkW2JpcmRsaWZlX2NpdHlfZGF0YV9maXhlZCRiaW9tZV9uYW1lICE9ICdCb3JlYWwgRm9yZXN0cy9UYWlnYScsXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBjYW4gd2UgZHJvcCBhIHZhcmlhYmxlPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIGJpb21lX25hbWUgKyBwb3B1bGF0aW9uX2dyb3d0aCwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgYmlvbWVfbmFtZSwgZGF0YSA9IGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwpKSRkZWx0YVsxXQpgYGAKCi0tIGRyb3AgYmlvbWVfbmFtZSB0byBnaXZlIENWRSBvZiA2LjUwMzQyMQotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX3NzbSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHJlZ2lvbl8xMDBrbV9zc20gdG8gZ2l2ZSBDVkUgb2YgNi40MTczMTEKLS0gY2FuIHdlIGRyb3AgYW5vdGhlcj8KCmBgYHtyfQpjdi5nbG0oYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCwgZ2xtKGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSArIHBvcHVsYXRpb25fZ3Jvd3RoLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtICsgcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSB0byBnaXZlIENWRSBvZiA2LjM0MjAyNQotLSBjYW4gd2UgZHJvcCBhbm90aGVyPwoKYGBge3J9CmN2LmdsbShiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsLCBnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcG9wdWxhdGlvbl9ncm93dGgsIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20sIGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWRfbm9fYm9yZWFsKSkkZGVsdGFbMV0KYGBgCgotLSBkcm9wIGNpdHlfZ2RwX3Blcl9wb3B1bGF0aW9uIHRvIGdpdmUgQ1ZFIG9mIDYuMjkxMjk5Ci0tIGlzIHRoaXMgYmV0dGVyIHRoYW4gbm8gdmFyaWFibGU/CgpgYGB7cn0KY3YuZ2xtKGJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWwsIGdsbShmb3JtdWxhID0gcmVzcG9uc2UgfiAxLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkX25vX2JvcmVhbCkpJGRlbHRhWzFdCmBgYAotLSB5ZXMsIGp1c3QhCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0tIHNvIGJlc3QgbW9kZWwgd2l0aCBiaXJkbGlmZSBpcyByZWdpb25fNTBrbV9zc20KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CnN1bW1hcnkoZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl81MGttX3NzbSkpCmBgYAoKYGBge3J9CnJlZ19iaXJkbGlmZSA9IGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCndpdGgoc3VtbWFyeShyZWdfYmlyZGxpZmUpLCAxIC0gZGV2aWFuY2UvbnVsbC5kZXZpYW5jZSkKYGBgCgoKYGBge3J9CmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQsIGFlcyh4ID0gcmVnaW9uXzUwa21fc3NtLCB5ID0gcmVzcG9uc2UpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iKQpgYGAKCgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGVjayBiaXJkbGlmZSBtb2RlbCBmaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KYmlyZGxpZmUuZml0IDwtIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCnN1bW1hcnkoYmlyZGxpZmUuZml0KQp3aXRoKHN1bW1hcnkoYmlyZGxpZmUuZml0KSwgMSAtIGRldmlhbmNlL251bGwuZGV2aWFuY2UpCnBsb3QoYmlyZGxpZmUuZml0KQpgYGAKYGBge3J9CmJpcmRsaWZlX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygxNiwgNTMsIDcyKSwgYygicmVnaW9uXzUwa21fc3NtIildCmBgYAoKYGBge3J9CmNpdHlfZGF0YVtjKDE2LCA1MywgNzIpLCBjKCJuYW1lIiwgInJlZ2lvbl81MGttX3NzbSIpXQpgYGAKCmBgYHtyfQpkYXQgPC0gcHJlZGljdChnbG0oZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzUwa21fc3NtLCBkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkKSwgc2UuZml0PVQpCgpvdXRzaWRlX3NlIDwtIGJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZFtiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQkcmVzcG9uc2UgPCBkYXQkZml0IC0gMTUqIGRhdCRzZS5maXQgfCBiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQkcmVzcG9uc2UgPiBkYXQkZml0ICsgMTUgKiBkYXQkc2UuZml0LF0KCmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQsIGFlcyh4ID0gcmVnaW9uXzUwa21fc3NtLCB5ID0gcmVzcG9uc2UpKSArIAogIGdlb21fcG9pbnQoc2l6ZT0xKSArIAogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnbG0iKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCBkYXRhID0gb3V0c2lkZV9zZSwgc2l6ZSA9IDMsIHBvc2l0aW9uID0gImRvZGdlIiwgdmp1c3QgPSAiaW53YXJkIiwgaGp1c3QgPSAiaW53YXJkIiwgY29sb3IgPSAicmVkIiwgYW5nbGU9LTE1KSArCiAgZ2VvbV9wb2ludChkYXRhID0gb3V0c2lkZV9zZSwgY29sb3IgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKwogIHlsYWIoIkNpdHkgUmFuZG9tIEVmZmVjdCBJbnRlcmNlcHQiKSArIHhsYWIoIlJlZ2lvbmFsICg1MGttKSBTU00iKSArIGxhYnModGl0bGUgPSAiQmlyZGxpZmUiKQoKZ2dzYXZlKCJjaXR5X2VmZmVjdF9yaWNobmVzc19fb3V0cHV0X19iaXJkbGlmZS5qcGciKQpgYGAKCkhvdyBtdWNoIHZhcmlhdGlvbiBoYXZlIHdlIGV4cGxhaW5lZD8KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KYmlyZGxpZmVfY2l0eV9kYXRhX25hbWVkJHJlc2lkdWFscyA8LSByZXNpZChiaXJkbGlmZS5maXQpCmdncGxvdChiaXJkbGlmZV9jaXR5X2RhdGFfbmFtZWQsIGFlcyh5ID0gcmVzcG9uc2UsIHggPSByZXNpZHVhbHMpKSArIAogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGKSArCiAgbGFicyh0aXRsZSA9ICJCaXJkbGlmZSIsIHN1YnRpdGxlID0gcGFzdGUoIkNvcnJlbGF0aW9uIiwgY29yKGJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCRyZXNpZHVhbHMsIGJpcmRsaWZlX2NpdHlfZGF0YV9uYW1lZCRyZXNwb25zZSkpKSArCiAgdGhlbWVfYncoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGVjayBNZXJsaW4gbW9kZWwgZml0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9Cm1lcmxpbi5maXQgPC0gZ2xtKGRhdGEgPSBtZXJsaW5fY2l0eV9kYXRhX25hbWVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fMTAwa21fc3NtICsgcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhKQpzdW1tYXJ5KG1lcmxpbi5maXQpCndpdGgoc3VtbWFyeShtZXJsaW4uZml0KSwgMSAtIGRldmlhbmNlL251bGwuZGV2aWFuY2UpCnBsb3QobWVybGluLmZpdCkKYGBgCgpgYGB7cn0KbWVybGluX2NpdHlfZGF0YV9maXhlZF9ub19ib3JlYWxbYygyNCwgNDIsIDcyKSwgYygicmVnaW9uXzEwMGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiKV0KYGBgCgpgYGB7cn0KY2l0eV9kYXRhW2MoMjQsIDQyLCA3MiksIGMoIm5hbWUiLCAicmVnaW9uXzEwMGttX3NzbSIsICJyZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEiKV0KYGBgCgpgYGB7cn0KZ2dwbG90KG1lcmxpbl9jaXR5X2RhdGFfbmFtZWQsIGFlcyh4ID0gcmVnaW9uXzEwMGttX3NzbSwgeSA9IHJlc3BvbnNlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaXplID0gcmVnaW9uXzUwa21fZWxldmF0aW9uX2RlbHRhKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2xtIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikgKwogIHlsYWIoIkNpdHkgUmFuZG9tIEVmZmVjdCBJbnRlcmNlcHQiKSArIHhsYWIoIlJlZ2lvbmFsICgxMDBrbSkgU1NNIikgKyBsYWJzKHRpdGxlID0gImVCaXJkIikgKyBndWlkZXMoc2l6ZT1ndWlkZV9sZWdlbmQodGl0bGU9IlJlZ2lvbmFsICg1MGttKSBFbGV2YXRpb24gRGVsdGEiKSkKCmdnc2F2ZSgiY2l0eV9lZmZlY3RfcmljaG5lc3NfX291dHB1dF9fbWVybGluLmpwZyIpCmBgYAoKSG93IG11Y2ggdmFyaWF0aW9uIGhhdmUgd2UgZXhwbGFpbmVkPwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYGBge3J9Cm1lcmxpbl9jaXR5X2RhdGFfbmFtZWQkcmVzaWR1YWxzIDwtIHJlc2lkKG1lcmxpbi5maXQpCmdncGxvdChtZXJsaW5fY2l0eV9kYXRhX25hbWVkLCBhZXMoeSA9IHJlc3BvbnNlLCB4ID0gcmVzaWR1YWxzKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKwogIGxhYnModGl0bGUgPSAiTWVybGluIiwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb24iLCBjb3IobWVybGluX2NpdHlfZGF0YV9uYW1lZCRyZXNpZHVhbHMsIG1lcmxpbl9jaXR5X2RhdGFfbmFtZWQkcmVzcG9uc2UpKSkgKwogIHRoZW1lX2J3KCkKYGBgCgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpDaGVjayBBSUMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CkFJQygKICBnbG0oZGF0YSA9IG1lcmxpbl9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgpLAogIGdsbShkYXRhID0gbWVybGluX2NpdHlfZGF0YV9maXhlZCwgZm9ybXVsYSA9IHJlc3BvbnNlIH4gcmVnaW9uXzEwMGttX3NzbSArIHJlZ2lvbl81MGttX2VsZXZhdGlvbl9kZWx0YSkKKQpgYGAKCmBgYHtyfQpBSUMoCiAgZ2xtKGRhdGEgPSBiaXJkbGlmZV9jaXR5X2RhdGFfZml4ZWQsIGZvcm11bGEgPSByZXNwb25zZSB+IHJlZ2lvbl8xMDBrbV9zc20gKyByZWdpb25fNTBrbV9zc20gKyByZWdpb25fNTBrbV9lbGV2YXRpb25fZGVsdGEgKyBiaW9tZV9uYW1lICsgcG9wdWxhdGlvbl9ncm93dGgpLAogIGdsbShkYXRhID0gYmlyZGxpZmVfY2l0eV9kYXRhX2ZpeGVkLCBmb3JtdWxhID0gcmVzcG9uc2UgfiByZWdpb25fNTBrbV9zc20pCikKYGBgCgoKCgoK